package com.relife.common.model;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.relife.common.http.HttpUtil;
import com.relife.common.utils.StringUtil;
import com.relife.common.utils.SysConfig;
import com.relife.core.entity.AppEntity;
import com.relife.core.entity.CodeEntity;
import com.relife.core.entity.ConfigEntity;
import com.relife.core.entity.SqlSetEntity;
import org.apache.commons.io.FileUtils;


/**
 * 线用户的管理
 * 
 * @author WU
 * @date 2015-6-9 下午7:43:37
 */

public class ClientManager {
	private static ClientManager instance = new ClientManager();

	private static LinkedHashMap<String, Client> map = new LinkedHashMap<String, Client>();
	private static Map<String, List<CodeEntity>> codeMap = new HashMap<String, List<CodeEntity>>();
	private static Map<String, String> sqlMap = new HashMap<String, String>();
	private static Map<String, String> reportsFieldsMap = new HashMap<String, String>(); // 所有报表表头字段列表（页面,报表头字段）
	private static HashMap<String, HttpSession> sessionMap = new HashMap<String, HttpSession>();
	private static AppEntity app = new AppEntity();
	private static Map<String, ConfigEntity> configMap = new HashMap<String, ConfigEntity>();

	/**
	 * 
	 * @author WU
	 * @date 2015-6-9 下午7:43:24
	 * @return
	 */
	public static ClientManager getInstance() {
		return instance;
	}

	/**
	 * 
	 * @author WU
	 * @date 2015-6-9 下午7:42:59
	 * @param client
	 */
	public void addClinet(Client client) {
		HttpUtil.getSession().setAttribute(SysConfig.USER_LOGIN_SESSION, client);
		sessionMap.put(HttpUtil.getSession().getId(), HttpUtil.getSession());
	}

	/**
	 * 获取在线人数
	 * 
	 * @author WU
	 * @date 2015-6-20 上午1:55:49
	 * @return
	 */
	public int getClientSize() {
		return map.values().size();
	}

	/**
	 * 获取在线用户
	 * 
	 * @author WU
	 * @date 2016年5月27日 上午9:56:16
	 * @return
	 */
	public LinkedHashMap<String, Client> getClientMap() {
		return map;
	}

	/**
	 * 
	 * @author WU
	 * @date 2015-6-9 下午7:43:05
	 */
	public void removeClinet() {
		sessionMap.remove(HttpUtil.getSession().getId());
		HttpUtil.getSession().invalidate();
	}

	/**
	 * 
	 * @author WU
	 * @date 2015-6-28 下午6:59:32
	 * @return
	 */
	public Client getClientSession() {
		HttpSession session = HttpUtil.getSession();
		if (session == null) {
			return null;
		} else {
			return map.get(session.getId());
		}
	}

	/**
	 * 
	 * @author WU
	 * @date 2015-6-28 下午6:59:32
	 * @return
	 */
	public static HttpSession getSession(String key) {
		return sessionMap.get(key);
	}

	/**
	 * 
	 * @author WU
	 * @date 2015-6-28 下午6:54:57
	 * @param codes
	 */
	public void addCode(List<CodeEntity> codes) {
		if (codes != null && codes.size() > 0) {
			for (CodeEntity code : codes) {
				codeMap.put(code.getCode(), code.getChildren());
			}
		}
	}

	/**
	 * 
	 * @author WU
	 * @date 2015-6-28 下午6:57:47
	 */
	public void clearCode() {
		codeMap.clear();
	}

	/**
	 * 
	 * @author WU
	 * @date 2016年4月3日 下午6:35:39
	 */
	public void clearClient() {
		map.clear();
	}

	/**
	 * 
	 * @author WU
	 * @date 2015-6-28 下午6:34:40
	 * @return
	 */
	public CodeEntity getCode(String code, String value) {
		List<CodeEntity> list = codeMap.get(code);
		if (list != null) {
			for (int i = 0; i < list.size(); i++) {
				if (list.get(i).getValue().equals(value)) {
					return list.get(i);
				}
			}
		}
		return null;
	}

	/**
	 * 
	 * @author WU
	 * @date 2015-6-28 下午6:43:38
	 * @return
	 */
	public List<CodeEntity> getCodeList(String code) {
		List<CodeEntity> list = codeMap.get(code);
		return list == null ? new ArrayList<CodeEntity>() : list;
	}

	/**
	 * 
	 * @author WU
	 * @date 2016年11月2日 上午10:37:38
	 * @param code
	 * @param exclude
	 * @return
	 */
	public List<CodeEntity> getCodeList(String code, String exclude) {
		List<CodeEntity> list = new ArrayList<CodeEntity>(getCodeList(code));
		if (StringUtil.isNotEmpty(exclude)) {
			String[] excludes = exclude.split(",");
			for (int i = 0; i < excludes.length; i++) {
				for (int j = list.size() - 1; j >= 0; j--) {
					if (list.get(j).getValue().equals(excludes[i])) {
						list.remove(j);
					}
				}
			}
		}
		return list;
	}

	/**
	 * @Title: addSql
	 * @Description: sql缓存
	 * @param sqlList
	 *            void
	 * @throws @exception
	 * @author fly
	 * @date 2016年11月22日 下午5:47:52
	 */
	public void addSql(List<SqlSetEntity> sqlList) {
		if (sqlList != null && sqlList.size() > 0) {
			for (SqlSetEntity sqlset : sqlList) {
				sqlMap.put(sqlset.getSqlKey(), sqlset.getSqlText());
			}
		}
	}

	/**
	 * @Title: getSql
	 * @Description: 获取sql
	 * @param key
	 * @return String
	 * @throws @exception
	 * @author fly
	 * @date 2016年11月22日 下午5:48:07
	 */
	public String getSql(String key) {
		return sqlMap.get(key);
	}

	/**
	 * 
	 * @author WU
	 * @date 2016年11月28日 下午3:41:18
	 */
	public void clearSql() {
		sqlMap.clear();
	}

	/**
	 * 增加报表的表头字段
	 * 
	 * @param key
	 *            页面
	 * @param value
	 *            对应表头字段
	 */
	public void addReportsFieldsMap(String key, String value) {
		reportsFieldsMap.put(key, value);
	}

	/**
	 * 获取指定页面的表头字段
	 * 
	 * @param key
	 *            页面名称
	 * @return 指定页面的表头字段
	 */
	public String getReportsFieldsMap(HttpServletRequest req, String key) {
		if (reportsFieldsMap.get(key) == null) {
			String fields = getFields(req, key);
			reportsFieldsMap.put(key, fields);
			return fields;
		} else
			return reportsFieldsMap.get(key);
	}

	// 提取传入页面内容的所有列
	private String getFields(HttpServletRequest req, String fileName) {
		List out = new ArrayList();
		StringBuffer outString = new StringBuffer("");
		String input = "";
		List<String> list = null;
		try {
			list = FileUtils.readLines(new File(req.getServletContext().getRealPath(fileName)));
		} catch (IOException e) {
			e.printStackTrace();
		}
		for (String strLine : list) {
			outString.append(strLine);
		}
		input = outString.toString();
		String temp = "";
		outString = new StringBuffer("");
		Pattern p = Pattern.compile("<t:datagrid.*?</t:datagrid>");
		Matcher m = p.matcher(input);
		// 取出这个图片datagrid
		while (m.find()) {
			out.add(m.group());
		}
		// 取出属性列
		p = Pattern.compile("field=\".*?\"");
		for (int i = 0; i < out.size(); i++) {
			m = p.matcher((String) out.get(i));
			// 取出属性名字
			while (m.find()) {
				temp = m.group().split("\"")[1];
				outString.append(temp + ",");
			}
		}
		temp = outString.toString();
		if (temp.endsWith(","))
			temp = temp.substring(0, temp.length() - 1);
		return temp;
	}

	public AppEntity getApp() {
		return app;
	}

	public void addApp(AppEntity app) {
		ClientManager.app = app;
	}

	/**
	 * 
	 * @author WU
	 * @date 2017年5月31日 下午4:21:55
	 * @param key
	 * @return
	 */
	public ConfigEntity getConfig(String key) {
		return configMap.get(key);
	}

	/**
	 * 
	 * @author WU
	 * @date 2017年5月31日 下午4:38:41
	 * @param key
	 * @return
	 */
	public String getConfigValue(String key) {
		ConfigEntity c = getConfig(key);
		if (c != null) {
			return c.getValue();
		} else {
			return null;
		}
	}

	/**
	 * 
	 * @author WU
	 * @date 2017年5月31日 下午4:21:52
	 * @param list
	 */
	public void addConfig(List<ConfigEntity> list) {
		configMap.clear();
		for (int i = 0; i < list.size(); i++) {
			configMap.put(list.get(i).getKey(), list.get(i));
		}
	}

	public void clearConfig() {
		configMap.clear();
	}

}
